import 'dart:convert';

import 'package:df/utils/logger_utils.dart';
import 'package:shared_preferences/shared_preferences.dart';

///https://www.jianshu.com/p/95e8b3e53f61
class SpUtils{
  //创建工厂方法
  static SpUtils? _instance;
  factory SpUtils() => _instance ??= SpUtils._initial();
  SharedPreferences? _preferences;
  //创建命名构造函数
  SpUtils._initial() {
    //为什么在这里需要新写init方法 主要是在命名构造中不能使用async/await
    init();
  }
  //初始化SharedPreferences
  void init() async {
    _preferences ??= await SharedPreferences.getInstance();
  }

  //到这里还没有完 有时候会遇到使用时提示 SharedPreferences 未初始化,所以还需要提供一个static 的方法
  static Future<SpUtils?> perInit() async {
    if (_instance == null) {
      //静态方法不能访问非静态变量所以需要创建变量再通过方法赋值回去
      SharedPreferences preferences = await SharedPreferences.getInstance();
      _instance = SpUtils._pre(preferences);
    }
    return _instance;
  }
  SpUtils._pre(SharedPreferences prefs) {
    _preferences = prefs;
  }
  
  ///通过泛型来获取数据
  T? get<T>(key) {
    var result = _preferences?.get(key);
    if (result != null) {
      return result as T;
    }
    return null;
  }
  ///获取JSON
  Map<String, dynamic>? getJson(key) {
    String? result = _preferences?.getString(key);
    if (result!.isNotEmpty) {
      return jsonDecode(result!);
    }
    return null;
  }
  ///文中的StringUtil中的isNotEmpty的判断
  ///  static isNotEmpty(String? str) {
  /// return str?.isNotEmpty ?? false;
  /// }
  ///清除全部
  void clean() {
    _preferences?.clear();
  }
  ///移除某一个
  void remove(key) {
    _preferences?.remove(key);
  }




  //------------------------------

  //============================
  Future<bool>? set(String key, dynamic value) {
    if (value.runtimeType == int) {
      return _preferences?.setInt(key, value);
    } else if (value.runtimeType == double) {
      return _preferences?.setDouble(key, value);
    } else if (value.runtimeType == bool) {
      return _preferences?.setBool(key, value);
    } else if (value.runtimeType == String) {
      return _preferences?.setString(key, value);
    } else if (value.runtimeType == List<String>) {
      return _preferences?.setStringList(key, value);
    }
    else {
      LogUtils.e("【SP】储存本地化未匹配到类型= ${value}");
      //throw Exception('【SP】储存本地化未匹配到类型= ${value}');
    }
  }

  ///设置setInt类型的
  @Deprecated("这个效率更高")
  void setInt(key, value) {
    _preferences?.setInt(key, value);
  }
  ///设置setDouble类型的
  @Deprecated("这个效率更高")
  void setDouble(key, value) {
    _preferences?.setDouble(key, value);
  }
  ///设置setBool类型的
  @Deprecated("这个效率更高")
  void setBool(key, value) {
    _preferences?.setBool(key, value);
  }
  ///设置String类型的
  @Deprecated("这个效率更高")
  void setString(key, value) {
    _preferences?.setString(key, value);
  }
  ///设置setStringList类型的
  @Deprecated("这个效率更高")
  void setStringList(key, value) {
    _preferences?.setStringList(key, value);
  }
  ///存储Json类型的
  @Deprecated("这个效率更高")
  void setJson(key, value) {
    value = jsonEncode(value);
    _preferences?.setString(key, value);
  }
//============================


}
